﻿using System;

namespace Transfer
{
    public delegate void OutPutLog(string text, params object[] prm);
    public delegate void ClearLog();
 
    /// <summary> Класс обеспечивает логирование событий. По умолчанию весь вывод ведется на консоль.
    /// Для организации своего вывода нужно определить делегат outputLog своим методом. 
    /// </summary>
    public class ActivityLog
    {
        /// <summary> Указатель на функцию вывода сообщения в Log
        /// </summary>
        public OutPutLog outPutLog;
        
        /// <summary> Указатель на  метод, очищающий лог.
        /// </summary>
        public ClearLog clearLog;

        public ActivityLog()
        {
            outPutLog = internalLogging;            // Подключим внутреннюю функцию вывода
            clearLog = delegate() { };              // Подключим заглушку функции очистки лога
        }

        /// <summary> Вывод сообщения в ActivityLog
        /// </summary>
        /// <param name="text">Выводимая строка. Может включать форматные символы.</param>
        /// <param name="prm">Параметры, которые могут быть вставлены в выводимую строку.</param>
        public void Out_Log(string text, params object[] prm)
        {
            outPutLog(text, prm);
        }

        /// <summary> Очистка лога от предыдущих значений
        /// </summary>
        public void Clear_Log()
        {
            clearLog();
        }

        /// <summary> Функция выводит форматированный текст на консоль.
        /// Текст всегда выводится с новой строки.
        /// </summary>
        /// <param name="text">Форматная строка</param>
        /// <param name="prm">Набор параметров</param>
        private void internalLogging(string text, params object[] prm)
        {
            string str = String.Format(text, prm);
            Console.WriteLine(str);
        }
    }
}
